package com.hyxt.DO;

import java.io.Serializable;

/**
 * @Project CNPC_VMS
 * @Title TransferData
 * @Description 服务传输对象父类，起作用是在服务调用中，为负载均衡提供id做均衡参考
 * @author guanhl
 * @date 2014年10月3日 下午3:16:34
 * @company Beijing Huayou Information andCommunication Technology Co.,Ltd
 * @Copyright Copyright (c) 2014
 * @version V2.0
 */
@SuppressWarnings("serial")
public abstract class TransferData implements Serializable {

	/**
	 * @Des 负载均衡需要的id
	 */
	String id;

	/**
	 * @Description 获取负载均衡需要的id
	 * @return 负载均衡需要的id
	 */
	public String getId() {
		return id;
	}

	/**
	 * @Description 设置负载均衡需要的id
	 * @param id 负载均衡需要的id
	 */
	public void setId(String id) {
		this.id = id;
	}

	/**
	 * @Description 重新哈希code，将id重新打乱生成哈希码
	 * @return hashcode
	 */
	@Override
	public int hashCode() {

		if (null == id) // 如果id为空取当前纳秒时间为hashcode,包成每次code不同
			return (int) System.nanoTime();

		// 返回hashcode
		return BKDRHash(id);
	}

	/**
	 * @Description BKDR哈希算法
	 * @param str 被生成哈希值的文本源
	 * @return 重新生成的哈希码
	 */
	public int BKDRHash(String str) {
		int seed = 13131; // 通常使用任意31间隔的组合，例如31 131 1313 13131 131313 etc..

		int hash = 0;
		// 遍历字符串的每一位字节，用字节的asc码与新值*13131相加
		for (int i = 0; i < str.length(); i++) {
			// 这就是累加的算法，比较简单，目的就是乱序的生成一个数字
			hash = (hash * seed) + str.charAt(i);
		}
		return hash;
	}
}
